001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Feb 14, 2003
005     * Time: 7:44:18 PM
006     */
007    
008    package EVolve.visualization.XYViz.RefRefViz;
009    
010    import EVolve.visualization.*;
011    import EVolve.Scene;
012    import EVolve.exceptions.NoDataPlotException;
013    import EVolve.data.Entity;
014    import EVolve.util.painters.*;
015    import EVolve.util.painters.placements.*;
016    import javax.swing.*;
017    import java.awt.*;
018    import java.awt.event.*;
019    import java.util.*;
020    
021    public class RelationshipViz extends CorrelationViz{
022        protected static int SELECT_OPTION = SELECT_X_AXIS|SELECT_Y_AXIS;
023        private static JMenuItem selectionMenu[] = null;
024        private JTextField textThreshold;
025        private int threshold=10;
026        private ArrayList menuList;
027        private JMenuItem itemReArrange;
028        private JMenu menuChangePlacement;
029        private JMenuItem itemSelectX, itemSelectY;
030        private JComboBox comboPlacement;
031        private Placement selectedPlacement;
032        private Placement[] placementList;
033    
034        public RelationshipViz() {
035            super();
036            menuList = new ArrayList();
037        }
038    
039        private void createPlacements() {
040            placementList = new Placement[2];
041            placementList[0] = new RectPlacement(10);
042            placementList[1] = new RoundPlacement(10);
043            selectedPlacement = placementList[0];
044        }
045    
046        protected Component createPanel() {
047            Component returnVal = super.createPanel();
048            canvas.setPanelFlag(AxesPanel.Null);
049            canvas.setZoomingSize(50,50);
050            flipMagnifier = false;
051            addMagnifier(canvas,flipMagnifier);
052    
053            return returnVal;
054        }
055    
056        protected JPanel createConfigurationPanel() {
057            JPanel panelBottom = new JPanel(new GridLayout(2,2));
058    
059            panelBottom.add(new JLabel("Threshold: "));
060    
061            textThreshold = new JTextField(String.valueOf(threshold), 10);
062            panelBottom.add(textThreshold);
063    
064            createPlacements();
065            panelBottom.add(new JLabel("Placement: "));
066            comboPlacement = new JComboBox();
067            for (int i = 0; i < placementList.length; i++) {
068                comboPlacement.addItem(placementList[i].getName());
069            }
070            panelBottom.add(comboPlacement);
071    
072            JPanel configurationPanel = new JPanel(new FlowLayout());
073            configurationPanel.add(panelBottom);
074    
075            return configurationPanel;
076        }
077    
078        protected void updateConfiguration() {
079            try {
080                threshold = Integer.parseInt(textThreshold.getText());
081                selectedPlacement = placementList[comboPlacement.getSelectedIndex()];
082                super.updateConfiguration();
083    
084            } catch (Exception e) {
085                Scene.showErrorMessage("Threshold must be an integer");
086                configure();
087            }
088        }
089    
090        public void autoUpdateConfiguration(HashMap config) {
091            super.autoUpdateConfiguration(config);
092            threshold = ((Integer)config.get("Interval")).intValue();
093            autoInterval = -1;
094            interval = -1;
095            if (config.get("Options")!=null) {
096                String equatorName = (String)config.get("Options");
097                for (int i=0; i<placementList.length; i++)
098                    if (placementList[i].getName().equals(equatorName)) {
099                        selectedPlacement = placementList[i];
100                        comboPlacement.setSelectedIndex(i);
101                        break;
102                    }
103            }
104        }
105    
106        public HashMap getCurrentConfigure() {
107            HashMap configure = super.getCurrentConfigure();
108    
109            configure.put("Interval", new Integer(threshold));
110            configure.put("Options", selectedPlacement.getName());
111    
112            return configure;
113        }
114    
115        protected void installPainter() {
116            painter = new RelationshipPainter();
117        }
118    
119        public void preVisualize() {
120            super.preVisualize();
121            image = new AutoShapeImage();
122        }
123    
124        public void visualize() {
125            ((RelationshipPainter)painter).updatePainterParameters(value,threshold);
126            painter.paint(image,xAxis.getDataFilter().getTargetType(),yAxis.getDataFilter().getTargetType(),10);
127            sort();
128        }
129    
130        public void sort() {
131            try {
132                AutoImage sorted = image.getSortedImage(xAxis,yAxis);
133                selectedPlacement.categoritize(sorted, yAxis.getDataFilter().getTargetType());
134                selectedPlacement.initialPlacement(sorted);
135                canvas.setImage(sorted.getImage());
136                canvas.repaint();
137            } catch (NoDataPlotException e) {
138                Scene.showErrorMessage(e.getMessage());
139            }
140        }
141    
142        public void mouseMove(int x, int y) {
143            int X = canvas.getImageX(x);
144            int Y = canvas.getImageY(y);
145            if (image != null) {
146                EVolve.util.painters.shapes.Shape entityShape = ((AutoShapeImage)image).getEntityShapes(X,Y);
147                if (entityShape != null) {
148                    Entity entity;
149                    if (entityShape.getEntityType() == xAxis.getDataFilter().getTargetType()) {
150                        entity = xAxis.getEntityFromInt((int)entityShape.getEntityID());
151                    } else {
152                        entity = yAxis.getEntityFromInt((int)entityShape.getEntityID());
153                    }
154                    Scene.setStatus(entity.getName());
155                } else
156                    Scene.setStatus(" ");
157            } else {
158                Scene.setStatus(" ");
159            }
160        }
161    
162        public Object clone() {
163            RelationshipViz o = (RelationshipViz)super.clone();
164    
165            o.menuList = new ArrayList();
166    
167            return o;
168        }
169    
170        public JMenuItem[] createSelectionMenuItem() {
171            if (selectionMenu != null) return selectionMenu;
172    
173            itemSelectX = new JCheckBoxMenuItem("Occurred Entities of Object One");
174            itemSelectX.setMnemonic(KeyEvent.VK_O);
175            itemSelectX.addActionListener(new ActionListener() {
176                public void actionPerformed(ActionEvent e) {
177                    boolean selected = itemSelectX.isSelected();
178                    SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_X_AXIS);
179                }
180            });
181            itemSelectX.setSelected(true);
182    
183            itemSelectY = new JCheckBoxMenuItem("Occurred Entities of Object Two");
184            itemSelectY.setMnemonic(KeyEvent.VK_T);
185            itemSelectY.addActionListener(new ActionListener() {
186                public void actionPerformed(ActionEvent e) {
187                    boolean selected = itemSelectY.isSelected();
188                    SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_Y_AXIS);
189                }
190            });
191            itemSelectY.setSelected(true);
192    
193            selectionMenu = new JMenuItem[2];
194            selectionMenu[0] = itemSelectX;
195            selectionMenu[1] = itemSelectY;
196    
197            return selectionMenu;
198        }
199    
200        public void makeSelection() {
201            if (SELECT_OPTION == 0) {
202                Scene.showErrorMessage("Nothing will be selected, please check Selection menu.");
203                return;
204            }
205    
206            int x1 = canvas.getStartX();
207            int x2 = canvas.getEndX();
208            int y1 = canvas.getStartY();
209            int y2 = canvas.getEndY();
210    
211            int[] selection = null;
212            HashMap entities = ((RelationshipPainter)painter).getEntitiesInBox(x1,y1,x2,y2);
213            int xComparator = xAxis.getSelectedComparatorIndex(), yComparator = yAxis.getSelectedComparatorIndex();
214            xAxis.selectComparator(1);
215            yAxis.selectComparator(1);
216            switch (SELECT_OPTION & 0xf0f0) {
217                case SELECT_X_AXIS: // select occurred entities of object one
218                    ArrayList idList = (ArrayList)entities.get(new Integer(xAxis.getDataFilter().getTargetType())) ;
219                    selection = new int[idList.size()];
220                    for (int i=0; i<idList.size(); i++) {
221                        selection[i] = ((Long)idList.get(i)).intValue();
222                    }
223                    xAxis.makeSelection(subjectDefinition.getType(),selection);
224                    break;
225                case 0x0000: // x axis is not seletcted
226                    break;
227            }
228    
229            switch (SELECT_OPTION & 0x0f0f) {
230                case SELECT_Y_AXIS: //select occurred entities of object two
231                    ArrayList idList = (ArrayList)entities.get(new Integer(yAxis.getDataFilter().getTargetType())) ;
232                    selection = new int[idList.size()];
233                    for (int i=0; i<idList.size(); i++) {
234                        selection[i] = ((Long)idList.get(i)).intValue();
235                    }
236                    yAxis.makeSelection(subjectDefinition.getType(),selection);
237                    break;
238                case 0x0000:
239                    break;
240            }
241            xAxis.selectComparator(xComparator);
242            yAxis.selectComparator(yComparator);
243        }
244    
245        protected ArrayList createOptionalMenu() {
246            if (menuList.size() > 0) return null;
247    
248            menuList.clear();
249            itemReArrange = new JMenuItem("Rearrange");
250            itemReArrange.setMnemonic(KeyEvent.VK_R);
251            itemReArrange.addActionListener(new ActionListener() {
252                public void actionPerformed(ActionEvent e) {
253                    String newSize = (String)JOptionPane.showInputDialog(Scene.getFrame(),
254                            "Input new threshold:",
255                            "Rearrange",
256                            JOptionPane.QUESTION_MESSAGE, null, null, String.valueOf(threshold));
257                    threshold = Integer.parseInt(newSize);
258                    canvas.scaleImage(false);
259                    sortValues();
260                    //((RelationshipPainter)painter).updatePainterParameters(value,threshold);
261                    painter.paint(image,xAxis.getDataFilter().getTargetType(),yAxis.getDataFilter().getTargetType(),10);
262                    sort();
263                }
264            });
265    
266            menuChangePlacement = new JMenu("Change Placement");
267            menuChangePlacement.setMnemonic(KeyEvent.VK_F);
268            for (int i = 0; i < placementList.length; i++) {
269                JMenuItem item = new JMenuItem(placementList[i].getName());
270                item.addActionListener(new ActionListener() {
271                    public void actionPerformed(ActionEvent e) {
272                        for (int j=0; j<placementList.length; j++) {
273                            if (placementList[j].getName().equals(((JMenuItem)e.getSource()).getActionCommand())) {
274                                selectedPlacement = placementList[j];
275                                sort();
276                                break;
277                            }
278                        }
279                    }
280                });
281                menuChangePlacement.add(item);
282            }
283            menuList.add(itemReArrange);
284            menuList.add(menuChangePlacement);
285            return menuList;
286        }
287    
288        private void sortValues() {
289            int newValues[][] = new int[value.length][value[0].length];
290    
291            for (int i=0; i<value.length; i++) {
292                for (int j=0; j<value[i].length; j++) {
293                    int x, y;
294                    x = xAxis.getSortedIndex(i);
295                    y = yAxis.getSortedIndex(j);
296                    if ((x!=-1)&&(y!=-1)) {
297                        newValues[x][y] = value[i][j];
298                    }
299                }
300            }
301    
302            ((RelationshipPainter)painter).updatePainterParameters(newValues,threshold);
303        }
304    
305        public void updateMenu() {
306            super.updateMenu();
307            itemChangeOrientation.setEnabled(false);
308            itemScale.setSelected(false);
309        }
310    }